#ifndef TPP_CAMERA_H
#define TPP_CAMERA_H

#include "frame.h"
#include "vect.h"

//! Klasa enkapsuluje kamere TPP
class TPPCamera
{
 typedef Vect< float > V3;

 private:

    bool isEnabled;
	Frame camera;
	Frame* objectToFollow;
	float distanceOnZ;
	float distanceOnY;
	float inclination;

 public:

	 //! Domyslny konstruktor
	TPPCamera() : objectToFollow( NULL ), distanceOnZ( 0 ), distanceOnY( 0 ), inclination( 0 ), isEnabled( false )
	{}

	//! Konstruktor pozwala od razu podac obiekt za ktorym podaza kamera
	TPPCamera( Frame* objectToFollow_ ) : objectToFollow( objectToFollow_ )
	{}

	//! Ustawia dystans pomiedzy kamera a obiektem za ktorym kamera podaza. 
	void SetDistanceOnZ( const float zDistance )
	{ distanceOnZ = zDistance; }
	
	//! Zwraca dystans pomiedzy kamera a obiektem za ktorym kamera podaza.
	float GetDistanceOnZ()
	{ return distanceOnZ; }

	//! Ustawia dystans pomiedzy kamera a obiektem za ktorym kamera podaza.
	void SetDistanceOnY( const float yDistance )
	{ distanceOnY = yDistance; }

	//! Zwraca dystans pomiedzy kamera a obiektem za ktorym kamera podaza.
	float GetDistanceOnY()
	{ return distanceOnY; }

	//! Ustawia stopien nachylenia kamery
	void SetInclination( const float inc )
	{ inclination = inc; }
 
	//! Zwraca stopien nachylenia kamery
	float GetInclination()
	{ return inclination; }

	//! Ustawia obiekt za ktorym podaza kamera
	void SetObjectToFollow( Frame* objToFollow )
	{ objectToFollow = objToFollow; }

	//! Zwraca obiekt za ktorym podaza kamera
	const Frame* GetFollowedObject()
	{ return objectToFollow; };

	//! Ustawia kamere w lokalnym ukl wsp
	void ApplyCameraTransform();

	//! Wlacza kamere
	void Enable()
	{ isEnabled = true; }

	//! Wylacza kamere
	void Disable()
	{ isEnabled = false; }

	//! Kamera wlaczona czy wylaczona?
	bool IsEnabled()
	{ return isEnabled; }

	//! Zwraca punkt w ktorym znajdyje sie kamera
	V3 GetOrigin()
	{ return camera.GetOrigin(); }
};



#endif